# 文件：res://scripts/Global.gd
# Implementation of TECH-T002
extends Node

# 卡牌数据库：以卡牌ID(String)为键，卡牌数据(Dictionary)为值
# 数据将由T004任务中的load_card_data()函数填充
var card_database: Dictionary = {}

# 动态羁绊数据库：以标签名(String)为键，羁绊层级数据(Dictionary)为值
# 示例结构: {"中华": {"2": {"type": "multiplier", "value": 0.3}}}
var synergy_db: Dictionary = {}

# 固定菜谱数据库：以菜谱名(String)为键，菜谱要求与效果(Dictionary)为值
# 示例结构: {"宫保鸡丁": {"required_cards": ["a", "b"], "effect": {...}}}
var recipe_db: Dictionary = {}

# 游戏状态变量（可根据需要后续添加）
var current_score: int = 0

# 能量相关变量
var current_energy: int = 3:
	set(value):
		# 限制能量值在0到max_energy之间
		current_energy = clampi(value, 0, max_energy)
		# 当能量值改变时发出信号
		energy_changed.emit(current_energy, max_energy)

var max_energy: int = 3

# 信号：当能量发生变化时发出
signal energy_changed(current_energy, max_energy)

# Called when the node enters the scene tree for the first time.
func _ready():
	# 项目启动时自动加载卡牌数据
	load_card_data()

# 新增函数：加载卡牌数据
func load_card_data() -> void:
	# 1. 重置数据库，防止重复加载导致数据重复
	card_database = {}

	# 2. 尝试打开文件
	var file = FileAccess.open("res://data/cards.json", FileAccess.READ)
	
	# 3. 检查文件是否成功打开
	if file == null:
		# 获取错误信息，便于调试
		var error = FileAccess.get_open_error()
		push_error("ERROR: Failed to open cards.json. Error code: " + str(error))
		return # 退出函数

	# 4. 读取文件内容为文本
	var json_text = file.get_as_text()
	file.close() # 重要：及时关闭文件

	# 5. 创建JSON解析器并尝试解析文本
	var json = JSON.new()
	var parse_result = json.parse(json_text)
	
	# 6. 检查解析是否成功
	if parse_result != OK:
		var error_message = json.get_error_message()
		var error_line = json.get_error_line()
		push_error("ERROR: Failed to parse JSON at line " + str(error_line) + ": " + error_message)
		return # 退出函数

	# 7. 获取解析后的数据
	var data = json.get_data()
	
	# 8. 检查数据结构是否符合预期
	if not data is Dictionary or not data.has("cards") or not data["cards"] is Array:
		push_error("ERROR: Invalid JSON structure. Expected a dictionary with a 'cards' array.")
		return

	# 9. 遍历卡牌数组，将每张卡牌存入card_database
	for card_data in data["cards"]:
		# 检查必要的字段是否存在
		if not card_data.has("id"):
			push_error("WARNING: Skipping a card entry missing 'id' field.")
			continue # 跳过这张卡

		var card_id = card_data["id"]
		# 以id为键，存储整张卡牌的数据字典
		card_database[card_id] = card_data

	# 10. 打印成功加载的信息（调试用）
	print("SUCCESS: Loaded ", card_database.size(), " cards into the database.")
	# 可选：打印所有加载的卡牌ID
	#print("Loaded card IDs: ", card_database.keys())

# 未来可以在这里添加各种辅助函数，例如：
# func get_card_data(card_id: String) -> Dictionary:
#	   return card_database.get(card_id, {})

# 能量管理函数
# 初始化能量
func reset_energy():
	current_energy = max_energy

# 消耗能量，返回是否成功消耗
func use_energy(amount: int) -> bool:
	if can_use_energy(amount):
		current_energy -= amount
		print("消耗了 ", amount, " 点能量，剩余: ", current_energy)
		return true
	else:
		print("能量不足！需要 ", amount, " 点，但只有 ", current_energy, " 点")
		return false

# 检查是否可以消耗指定数量的能量
func can_use_energy(amount: int) -> bool:
	return current_energy >= amount

# 恢复能量（可用于未来技能或道具）
func gain_energy(amount: int):
	current_energy += amount
	print("恢复了 ", amount, " 点能量，当前: ", current_energy)

# 设置最大能量（可用于未来升级）
func set_max_energy(new_max: int):
	max_energy = new_max
	current_energy = min(current_energy, max_energy) # 确保当前能量不超过新的上限 
